home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / speedbal.c < prev    next >
C/C++ Source or Header  |  2000-05-04  |  10KB  |  396 lines

  1.  /****************************************************************************
  2.  *                                      *
  3.  * vidhrdw.c                                *
  4.  *                                      *
  5.  * Functions to emulate the video hardware of the machine.          *
  6.  *                                      *
  7.  ****************************************************************************/
  8.  
  9. #include "driver.h"
  10. #include "vidhrdw/generic.h"
  11.  
  12. #define SPRITE_X        0
  13. #define SPRITE_NUMBER       1
  14. #define SPRITE_PALETTE      2
  15. #define SPRITE_Y        3
  16.  
  17. extern unsigned char *speedbal_background_videoram;
  18. extern unsigned char *speedbal_foreground_videoram;
  19. extern unsigned char *speedbal_sprites_dataram;
  20.  
  21. extern size_t speedbal_background_videoram_size;
  22. extern size_t speedbal_foreground_videoram_size;
  23. extern size_t speedbal_sprites_dataram_size;
  24.  
  25. static unsigned char *bg_dirtybuffer;      /* background tiles */
  26. static unsigned char *ch_dirtybuffer;      /* foreground char  */
  27.  
  28. static struct osd_bitmap *bitmap_bg;   /* background tiles */
  29. static struct osd_bitmap *bitmap_ch;   /* foreground char  */
  30.  
  31. void speedbal_vh_convert_color_prom(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom)
  32. {
  33.     int i;
  34.     #define TOTAL_COLORS(gfxn) (Machine->gfx[gfxn]->total_colors * Machine->gfx[gfxn]->color_granularity)
  35.     #define COLOR(gfxn,offs) (colortable[Machine->drv->gfxdecodeinfo[gfxn].color_codes_start + offs])
  36.  
  37.  
  38.     for (i = 0;i < Machine->drv->total_colors;i++)
  39.     {
  40.         int bit0,bit1,bit2;
  41.  
  42.  
  43.         /* red component */
  44.         bit0 = (*color_prom >> 0) & 0x01;
  45.         bit1 = (*color_prom >> 1) & 0x01;
  46.         bit2 = (*color_prom >> 2) & 0x01;
  47.         *(palette++) = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
  48.         /* green component */
  49.         bit0 = (*color_prom >> 3) & 0x01;
  50.         bit1 = (*color_prom >> 4) & 0x01;
  51.         bit2 = (*color_prom >> 5) & 0x01;
  52.         *(palette++) = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
  53.         /* blue component */
  54.         bit0 = 0;
  55.         bit1 = (*color_prom >> 6) & 0x01;
  56.         bit2 = (*color_prom >> 7) & 0x01;
  57.         *(palette++) = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
  58.  
  59.         color_prom++;
  60.     }
  61.  
  62.  
  63.     /* characters */
  64.     for (i = 0;i < TOTAL_COLORS(0);i++)
  65.         COLOR(0,i) = *(color_prom++) ;
  66.  
  67.     /* tiles */
  68.     for (i = 0;i < TOTAL_COLORS(1);i++)
  69.         COLOR(1,i) = *(color_prom++) & 0x0f;
  70.  
  71.     /* sprites */
  72.     for (i = 0;i < TOTAL_COLORS(2);i++)
  73.         COLOR(2,i) = *(color_prom++) & 0x0f;
  74.  
  75. }
  76.  
  77.  
  78. /*************************************
  79.  *                   *
  80.  *        Start-Stop         *
  81.  *                   *
  82.  *************************************/
  83.  
  84. int speedbal_vh_start (void)
  85. {
  86.     if ((bg_dirtybuffer = malloc (speedbal_background_videoram_size)) == 0)
  87.     {
  88.         return 1;
  89.     }
  90.     if ((ch_dirtybuffer = malloc (speedbal_foreground_videoram_size)) == 0)
  91.     {
  92.         free (bg_dirtybuffer);
  93.         return 1;
  94.     }
  95.  
  96.     /* foreground bitmap */
  97.     if ((bitmap_ch = osd_new_bitmap (Machine->drv->screen_width,Machine->drv->screen_height,Machine->scrbitmap->depth)) == 0)
  98.     {
  99.         free (bg_dirtybuffer);
  100.         free (ch_dirtybuffer);
  101.         return 1;
  102.     }
  103.  
  104.     /* background bitmap */
  105.     if ((bitmap_bg = osd_new_bitmap (Machine->drv->screen_width*2,Machine->drv->screen_height*2,Machine->scrbitmap->depth)) == 0)
  106.     {
  107.         free (bg_dirtybuffer);
  108.         free (ch_dirtybuffer);
  109.         osd_free_bitmap (bitmap_ch);
  110.         return 1;
  111.     }
  112.  
  113.     memset (ch_dirtybuffer,1,speedbal_foreground_videoram_size / 2);
  114.     memset (bg_dirtybuffer,1,speedbal_background_videoram_size / 2);
  115.     return 0;
  116.  
  117. }
  118.  
  119. void speedbal_vh_stop (void)
  120. {
  121.     osd_free_bitmap (bitmap_ch);
  122.     osd_free_bitmap (bitmap_bg);
  123.     free (bg_dirtybuffer);
  124.     free (ch_dirtybuffer);
  125. }
  126.  
  127.  
  128.  
  129. /*************************************
  130.  *                   *
  131.  *      Foreground characters RAM    *
  132.  *                   *
  133.  *************************************/
  134.  
  135. WRITE_HANDLER( speedbal_foreground_videoram_w )
  136. {
  137.    ch_dirtybuffer[offset] = 1;
  138.    speedbal_foreground_videoram[offset]=data;
  139. }
  140.  
  141. READ_HANDLER( speedbal_foreground_videoram_r )
  142. {
  143.    return speedbal_foreground_videoram[offset];
  144. }
  145.  
  146.  
  147.  
  148. /*************************************
  149.  *                   *
  150.  *    Background tiles RAM       *
  151.  *                   *
  152.  *************************************/
  153.  
  154. WRITE_HANDLER( speedbal_background_videoram_w )
  155. {
  156.    bg_dirtybuffer[offset] = 1;
  157.    speedbal_background_videoram[offset] = data;
  158. }
  159.  
  160. READ_HANDLER( speedbal_background_videoram_r )
  161. {
  162.    return speedbal_background_videoram[offset];
  163. }
  164.  
  165.  
  166.  
  167.  
  168. /*************************************
  169.  *                   *
  170.  *     Sprite drawing        *
  171.  *                   *
  172.  *************************************/
  173.  
  174. void speedbal_draw_sprites (struct osd_bitmap *bitmap)
  175. {
  176.     int SPTX,SPTY,SPTTile,SPTColor,offset,f;
  177.     unsigned char carac;
  178.     unsigned char *SPTRegs;
  179.  
  180.     /* Drawing sprites: 64 in total */
  181.  
  182.     for (offset = 0;offset < speedbal_sprites_dataram_size;offset += 4)
  183.     {
  184.         SPTRegs = &speedbal_sprites_dataram[offset];
  185.  
  186.  
  187.         SPTX = 243 - SPTRegs[SPRITE_Y];
  188.         SPTY = 239 - SPTRegs[SPRITE_X];
  189.  
  190.         carac  =  SPTRegs[SPRITE_NUMBER ];
  191.         SPTTile=0;
  192.         for (f=0;f<8;f++) SPTTile+= ((carac >>f)&1)<<(7-f);
  193.         SPTColor = (SPTRegs[SPRITE_PALETTE]&0x0f);
  194.  
  195.         if (!(SPTRegs[SPRITE_PALETTE]&0x40)) SPTTile+=256;
  196.  
  197.         drawgfx (bitmap,Machine->gfx[2],
  198.                 SPTTile,
  199.                 SPTColor,
  200.                 0,0,
  201.                 SPTX,SPTY,
  202.                 &Machine->drv->visible_area,TRANSPARENCY_PEN,0);
  203.     }
  204. }
  205.  
  206.  
  207.  
  208. /*************************************
  209.  *                   *
  210.  *     Background drawing: Tiles     *
  211.  *                   *
  212.  *************************************/
  213.  
  214. void speedbal_draw_background (struct osd_bitmap *bitmap)
  215. {
  216.     int sx,sy,code,tile,offset,color;
  217.  
  218.     for (offset = 0;offset < speedbal_background_videoram_size ;offset+=2)
  219.     {
  220.         if (bg_dirtybuffer[offset])
  221.         {
  222.             bg_dirtybuffer[offset] = 0;
  223.  
  224.             tile = speedbal_background_videoram[offset+0];
  225.             code = speedbal_background_videoram[offset+1];
  226.             tile += (code & 0x30) << 4;
  227.             color=(code&0x0f);
  228.  
  229.             sx = 15 - (offset / 2) / 16;
  230.             sy = (offset / 2) % 16;
  231.  
  232.             drawgfx (bitmap,Machine->gfx[1],
  233.                     tile,
  234.                     color,
  235.                     0,0,
  236.                     16*sx,16*sy,
  237.                     0,TRANSPARENCY_NONE,0);
  238.         }
  239.     }
  240. }
  241.  
  242.  
  243. /*************************************
  244.  *                   *
  245.  *   Foreground drawing: 8x8 graphs  *
  246.  *                   *
  247.  *************************************/
  248.  
  249. void speedbal_draw_foreground1 (struct osd_bitmap *bitmap)
  250. {
  251.     int sx,sy,code,caracter,color,offset;
  252.  
  253.     for (offset = 0;offset < speedbal_foreground_videoram_size ;offset+=2)
  254.     {
  255.         if (ch_dirtybuffer[offset])
  256.         {
  257.             caracter = speedbal_foreground_videoram[offset];
  258.             code     = speedbal_foreground_videoram[offset+1];
  259.             caracter += (code & 0x30) << 4;
  260.  
  261.             color=(code&0x0f);
  262.  
  263.             sx = 31 - (offset / 2) / 32;
  264.             sy = (offset / 2) % 32;
  265.  
  266.             drawgfx (bitmap,Machine->gfx[0],
  267.                     caracter,
  268.                     color,
  269.                     0,0,
  270.                     8*sx,8*sy,
  271.                     0,TRANSPARENCY_NONE,0);
  272.  
  273.             ch_dirtybuffer[offset] = 0;
  274.         }
  275.  
  276.     }
  277. }
  278.  
  279.  
  280. /*************************************
  281.  *                   *
  282.  *     Refresh   screen      *
  283.  *                   *
  284.  *************************************/
  285.  
  286. void speedbal_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  287. {
  288.     int offs;
  289.  
  290.  
  291. palette_init_used_colors();
  292.  
  293. {
  294.     int color,code,i;
  295.     int colmask[16];
  296.     int pal_base;
  297.  
  298.  
  299.     pal_base = Machine->drv->gfxdecodeinfo[1].color_codes_start;
  300.  
  301.     for (color = 0;color < 16;color++) colmask[color] = 0;
  302.  
  303.     for (offs = 0;offs < speedbal_background_videoram_size ;offs += 2)
  304.     {
  305.         code = speedbal_background_videoram[offs];
  306.         color = speedbal_background_videoram[offs+1];
  307.         code += (color & 0x30) << 4;
  308.         color = (color & 0x0f);
  309.         colmask[color] |= Machine->gfx[1]->pen_usage[code];
  310.     }
  311.  
  312.     for (color = 0;color < 16;color++)
  313.     {
  314.         for (i = 0;i < 16;i++)
  315.         {
  316.             if (colmask[color] & (1 << i))
  317.                 palette_used_colors[pal_base + 16 * color + i] = PALETTE_COLOR_USED;
  318.         }
  319.     }
  320.  
  321.  
  322.     pal_base = Machine->drv->gfxdecodeinfo[2].color_codes_start;
  323.  
  324.     for (color = 0;color < 16;color++) colmask[color] = 0;
  325.  
  326.     for (offs = 0;offs < speedbal_sprites_dataram_size;offs += 4)
  327.     {
  328.         unsigned char *SPTRegs;
  329.         int carac,f;
  330.  
  331.         SPTRegs = &speedbal_sprites_dataram[offs];
  332.  
  333.         carac  =  SPTRegs[SPRITE_NUMBER ];
  334.         code = 0;
  335.         for (f=0;f<8;f++) code += ((carac >>f)&1)<<(7-f);
  336.         color = (SPTRegs[SPRITE_PALETTE]&0x0f);
  337.  
  338.         if (!(SPTRegs[SPRITE_PALETTE]&0x40)) code+=256;
  339.         colmask[color] |= Machine->gfx[2]->pen_usage[code];
  340.     }
  341.  
  342.     for (color = 0;color < 16;color++)
  343.     {
  344.         if (colmask[color] & (1 << 0))
  345.             palette_used_colors[pal_base + 16 * color] = PALETTE_COLOR_TRANSPARENT;
  346.         for (i = 1;i < 16;i++)
  347.         {
  348.             if (colmask[color] & (1 << i))
  349.                 palette_used_colors[pal_base + 16 * color + i] = PALETTE_COLOR_USED;
  350.         }
  351.     }
  352.  
  353.  
  354.     pal_base = Machine->drv->gfxdecodeinfo[0].color_codes_start;
  355.  
  356.     for (color = 0;color < 16;color++) colmask[color] = 0;
  357.  
  358.     for (offs = 0;offs < speedbal_foreground_videoram_size ;offs+=2)
  359.     {
  360.         code = speedbal_foreground_videoram[offs];
  361.         color = speedbal_foreground_videoram[offs+1];
  362.         code += (color & 0x30) << 4;
  363.         color = (color & 0x0f);
  364.         colmask[color] |= Machine->gfx[0]->pen_usage[code];
  365.     }
  366.  
  367.     for (color = 0;color < 16;color++)
  368.     {
  369.         if (colmask[color] & (1 << 0))
  370.             palette_used_colors[pal_base + 16 * color] = PALETTE_COLOR_TRANSPARENT;
  371.         for (i = 1;i < 16;i++)
  372.         {
  373.             if (colmask[color] & (1 << i))
  374.                 palette_used_colors[pal_base + 16 * color + i] = PALETTE_COLOR_USED;
  375.         }
  376.     }
  377.  
  378.     if (palette_recalc())
  379.     {
  380.         memset (ch_dirtybuffer,1,speedbal_foreground_videoram_size / 2);
  381.         memset (bg_dirtybuffer,1,speedbal_background_videoram_size / 2);
  382.     }
  383. }
  384.  
  385.     // first background
  386.     speedbal_draw_background (bitmap_bg);
  387.     copybitmap (bitmap,bitmap_bg,0,0,0,0,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  388.  
  389.     // second characters (general)
  390.     speedbal_draw_foreground1 (bitmap_ch);
  391.     copybitmap (bitmap,bitmap_ch,0,0,0,0,&Machine->drv->visible_area,TRANSPARENCY_PEN,palette_transparent_pen);
  392.  
  393.     // thirth sprites
  394.     speedbal_draw_sprites (bitmap);
  395. }
  396.